//
//  BRMessage.h
//  ZhuShou
//
//  Created by Dejun Liu on 15/11/9.
//  Copyright © 2015年 jw. All rights reserved.
//
//
//
//  用于：协议如下（将来可能进行改动）：
//  总包长度（2字节）+指令码（2字节）+业务包长度（2字节）+业务包（N字节，<500）
//  总包长度的值 = 6 + 业务包长度的值
//  业务包 = JSON 数据
//

#define BRMessageDefaultTimeOut 3
#define BRMessageDefaultRetryCount 3

typedef enum : NSUInteger {
    BRMessageResponseTypeRetrying,  //正在重试
    BRMessageResponseTypeTimeout,   //重试次数用完后，没有结果返回
    BRMessageResponseTypeSuccess,   //收到服务器消息
} BRMessageResponseType;


/**
 *  服务器response的block回调
 *
 *  @param jsonString 服务器响应字符串
 */
typedef void(^ResponseBlock)(BRMessageResponseType type,NSInteger retryCount,id responseObj);

/**
 *  完成服务器响应消息处理后发出通知，让BRUDPService请这条消息在消息队列中的纪录
 */
extern NSString *BRMessageNotificationDidFinishedProcessResponse;

#import <Foundation/Foundation.h>

@interface BRMessage : NSObject

/**
 *  消息指令码
 */
@property (nonatomic,assign) UInt16 cmd;

/**
 *  json消息字符串
 */
@property (nonatomic,strong) NSString *msg;

/**
 *  服务器返回的消息
 */
@property (nonatomic,strong) NSString *responseMsg;

/**
 *  消息发送的时间
 */
@property (nonatomic,strong) NSDate *sendDate;

/**
 *  服务器返回消息的时间
 */
@property (nonatomic,strong) NSDate *backDate;

/**
 *  YES收到服务器消息，NO还没收到服务器消息
 */
@property (nonatomic,assign) BOOL isFinished;

/**
 * 默认超时时间为3秒
 *  从发送时间起计算，超时时间，超过了这个时间服务器还没返回值，需要重新发送
 */
@property (nonatomic,assign) NSTimeInterval timeOut;

/**
 *  最大重试次数
 */
@property (nonatomic,assign) NSInteger maxRetryCount;

/**
 *  默认重试次数为3次
 *  服务器响应失败重试次数
 */
@property (nonatomic,assign) NSInteger retryCount;

/**
 *  服务器收到数据后，回调对应的方法
 */
@property (nonatomic,copy)  ResponseBlock responseBlock;

/**
 *  转化服务器返回的对应的消息
 *
 *  @param data 服务器返回没有解码数据
 *
 *  @return 解码后的消息体
 */
+ (BRMessage *)messageWithPackageData:(NSData *)data;

+ (BRMessage *)messageWithCmd:(UInt16) cmd msg:(NSString *)msg;

/**
 *  获取将消息编码后的二进制
 *
 *  @return 编码二进制
 */
- (NSData *)getPackageData;

/**
 *  收到服务器数据后，调用responseBlock在新的线程中，block块之行完毕后发出通知让BRUDPService类
 *  的消息队列，移除这个消息请求
 */
- (void)callResponseBlockAtOtherThread;

/**
 *  在当前线程中回调消息
 */
- (void)callResponseBlock;

@end
